UNPKG

clean-architecture

Version:

Utilities for implementing clean architecture using Redux

34 lines (33 loc) 1.19 kB
import type { NonPostableEvt } from "evt"; import type { Middleware, ActionCreator, ActionCreatorWithPayload, ActionCreatorWithoutPayload } from "@reduxjs/toolkit"; export type UsecaseLike = { name: string; } & ({ actions: Record<string, ActionCreator<any>>; } | { reducer: null; actions?: undefined; }); type RecordToUnion<O> = O[keyof O]; type CaseReducerToEvent<T extends Record<string, ActionCreator<any>>> = RecordToUnion<{ [K in keyof T]: { actionName: K; } & (T[K] extends ActionCreatorWithoutPayload<any> ? {} : { payload: T[K] extends ActionCreatorWithPayload<infer U> ? U : never; }); }>; export type UsecaseToEvent<Usecase extends UsecaseLike> = RecordToUnion<{ [Key in Extract<Usecase, { actions: unknown; }>["name"]]: Usecase extends Extract<Usecase, { name: Key; actions: unknown; }> ? { usecaseName: Key; } & CaseReducerToEvent<Usecase["actions"]> : never; }>; export declare function createMiddlewareEvtAction<Usecase extends UsecaseLike>(usecasesArr: readonly Usecase[]): { evtAction: NonPostableEvt<UsecaseToEvent<Usecase>>; middlewareEvtAction: Middleware; }; export {};