import { ActionCreator, ActionCreatorWithPreparedPayload, AnyAction, Dispatch, MiddlewareAPI } from '@reduxjs/toolkit'; import { EffectMiddleware } from './effects.js'; import Updux from './Updux.js'; export type DuxConfig = Partial<{ initialState: any; subduxes: Record; actions: Record | Function | null>; selectors: Record; effects: EffectMiddleware[]; reactions: DuxReaction[]; reducer: (state: any, action: AnyAction) => any; }>; type UpduxConfig = D extends Updux ? T : D; export type SubduxesState = D extends { subduxes: infer S; } ? { [key in keyof S]: DuxState>; } : unknown; type ForceResolveObject = O extends { [key: string]: any; } ? { [key in keyof O]: O[key]; } : O; export type DuxState = ForceResolveObject<(D extends { initialState: any; } ? D['initialState'] : {}) & (D extends { subduxes: any; } ? SubduxesState : unknown)>; type SubduxesActions = D extends { subduxes: infer S; } ? UnionToIntersection>> : unknown; type IfAny = 0 extends 1 & T ? Y : N; type IsAny = IfAny; type ResolveAction = true extends IsAny ? ActionCreator : A extends Function & { type: string; } ? A : A extends (...args: infer PARAMS) => infer R ? ActionCreatorWithPreparedPayload : ActionCreator; type ResolveActions = A extends { [key: string]: any; } ? { [key in keyof A]: key extends string ? ResolveAction : never; } : A; export type DuxActions = ResolveActions<(D extends { actions: any; } ? D['actions'] : {}) & (D extends { subduxes: any; } ? SubduxesActions : unknown)>; export type Subduxes = Record | DuxConfig>; export type MutationEntry = { terminal: boolean; matcher?: (action: AnyAction) => boolean; mutation: Mutation; }; export type Mutation = (payload: A extends { payload: infer P; } ? P : undefined, action: A) => (state: S) => S | void; type CurriedSelectors = { [key in keyof S]: CurriedSelector; }; type XSel = R extends Function ? R : () => R; type CurriedSelector = S extends (...args: any) => infer R ? XSel : never; export type AugmentedMiddlewareAPI = MiddlewareAPI, DuxState> & { dispatch: DuxActions; getState: CurriedSelectors>; actions: DuxActions; selectors: DuxSelectors; }; export type DuxSelectors = ForceResolveObject<(D extends { selectors: infer S; } ? S : {}) & (D extends { subduxes: infer SUB; } ? UnionToIntersection; }>> : {})>; export type UnionToIntersection = (U extends any ? (k: U) => void : never) extends (k: infer I) => void ? I : never; type RebaseSelectors = DUX extends { selectors: infer S; } ? { [key in keyof S]: RebaseSelector; } : never; type RebaseSelector = SLICE extends string ? S extends (state: infer STATE) => infer R ? (state: Record) => R : never : never; type Values = X[keyof X]; export type DuxReaction = (api: AugmentedMiddlewareAPI) => (state: DuxState, previousState: DuxState | undefined, unsubscribe: () => void) => void; export {};