import { getAllMethodsFromModule } from './helpers/module' import { StonexModule } from './StonexModule' import { Store } from './StonexStore' export declare type StoreModifier = (store: Store | null) => (void | D) export declare type ModuleModifier = (module: StonexModule) => (void | D) export declare type ActionModifier = (args: any[], moduleName: string, methodName: string) => false | any export declare type Modifier = StoreModifier /** * Internal class which usings only in StonexStore code * Allows to convert outer modifiers to Action/Module/Store specific modifiers * */ export class ModifiersWorker { public static getModuleModifiers (modifiers: Array>, storeInstance: Store): ModuleModifier[] { return modifiers.reduce((moduleModifiers: ModuleModifier[], modifier) => { const moduleModifier: ModuleModifier | any = modifier(storeInstance) if (typeof moduleModifier === 'function') { moduleModifiers.push(moduleModifier) } return moduleModifiers },[]) } public static getActionModifiers (moduleModifiers: ModuleModifier[], moduleInstance: StonexModule): ActionModifier[] { return moduleModifiers.reduce((actionModifiers: ActionModifier[], moduleModifier: ModuleModifier) => { const actionModifier: ActionModifier | any = moduleModifier(moduleInstance) if (typeof actionModifier === 'function') { actionModifiers.push(actionModifier) } return actionModifiers }, []) } public static attachActionModifiersToModule (actionModifiers: ActionModifier[], moduleInstance: StonexModule): void { getAllMethodsFromModule(moduleInstance).forEach(methodName => { const closuredMethod = moduleInstance[methodName] moduleInstance[methodName] = (...args: any[]) => { for (const modifier of actionModifiers) { if (modifier(args, moduleInstance.moduleName, methodName) === false) { return null } } return closuredMethod.apply(moduleInstance, args) } }) } }