1
import { getAllMethodsFromModule } from './helpers/module'
2
import { StonexModule } from './StonexModule'
3
import { Store } from './StonexStore'
5
export declare type StoreModifier<MP, D = ModuleModifier> = (store: Store<MP> | null) => (void | D)
6
export declare type ModuleModifier<D = ActionModifier> = (module: StonexModule) => (void | D)
7
export declare type ActionModifier = (args: any[], moduleName: string, methodName: string) => false | any
9
export declare type Modifier<MP> = StoreModifier<MP>
16
export class ModifiersWorker {
18
public static getModuleModifiers<MP> (modifiers: Array<Modifier<MP>>, storeInstance: Store<MP>): ModuleModifier[] {
19
return modifiers.reduce((moduleModifiers: ModuleModifier[], modifier) => {
20
const moduleModifier: ModuleModifier | any = modifier(storeInstance)
21
if (typeof moduleModifier === 'function') {
22
moduleModifiers.push(moduleModifier)
24
return moduleModifiers
28
public static getActionModifiers (moduleModifiers: ModuleModifier[], moduleInstance: StonexModule): ActionModifier[] {
29
return moduleModifiers.reduce((actionModifiers: ActionModifier[], moduleModifier: ModuleModifier) => {
30
const actionModifier: ActionModifier | any = moduleModifier(moduleInstance)
31
if (typeof actionModifier === 'function') {
32
actionModifiers.push(actionModifier)
34
return actionModifiers
38
public static attachActionModifiersToModule (actionModifiers: ActionModifier[], moduleInstance: StonexModule): void {
39
getAllMethodsFromModule(moduleInstance).forEach(methodName => {
40
const closuredMethod = moduleInstance[methodName]
41
moduleInstance[methodName] = (...args: any[]) => {
42
for (const modifier of actionModifiers) {
43
if (modifier(args, moduleInstance.moduleName, methodName) === false) {
47
return closuredMethod.apply(moduleInstance, args)