clean-architecture
Version:
Utilities for implementing clean architecture using Redux
32 lines (31 loc) • 1.88 kB
TypeScript
import type { NonPostableEvt } from "evt";
import type { ReturnType } from "tsafe";
import { type GenericStore, type UsecaseLike as UsecaseLike_store } from "./createStore";
import { type CoreEvts, type GenericCreateEvt, type UsecaseLike as UsecaseLike_evts } from "./usecasesToEvts";
import { type CoreStates, type UsecaseLike as UsecaseLike_selectors } from "./usecasesToStates";
import { CoreFunctions, type UsecaseLike as UsecaseLike_functions } from "./usecasesToFunctions";
import type { ThunkAction, Action } from "@reduxjs/toolkit";
type UsecaseLike = UsecaseLike_store & UsecaseLike_evts & UsecaseLike_selectors & UsecaseLike_functions;
export type GenericCore<Usecases extends Record<string, UsecaseLike>, Context extends Record<string, unknown>> = {
states: CoreStates<Usecases[keyof Usecases]>;
evtStateUpdated: NonPostableEvt<void>;
evts: CoreEvts<Usecases[keyof Usecases]>;
functions: CoreFunctions<Usecases[keyof Usecases]>;
types: {
State: ReturnType<GenericStore<Context, Usecases[keyof Usecases]>["getState"]>;
CreateEvt: GenericCreateEvt<GenericStore<Context, Usecases[keyof Usecases]>>;
Thunks: Record<string, (params: any) => ThunkAction<any, ReturnType<GenericStore<Context, Usecases[keyof Usecases]>["getState"]>, Context & {
evtAction: GenericStore<Context, Usecases[keyof Usecases]>["evtAction"];
}, Action<string>>>;
};
};
export declare function createCore<Usecases extends Record<string, UsecaseLike>, Context extends Record<string, unknown>>(params: {
context: Context;
usecases: Usecases;
}): {
core: GenericCore<Usecases, Context>;
dispatch: GenericStore<Context, Usecases[keyof Usecases]>["dispatch"];
getState: GenericStore<Context, Usecases[keyof Usecases]>["getState"];
evtAction: GenericStore<Context, Usecases[keyof Usecases]>["evtAction"];
};
export {};