import R from 'remeda'; /** * Configuration object typically passed to the constructor of the class Updux. */ export interface UpduxConfig { /** * Local initial state. * @default {} */ initial?: TState; /** * Subduxes to be merged to this dux. */ subduxes?: TSubduxes; } type StateOf = D extends { initial: infer I } ? I : unknown; export type DuxStateSubduxes = keyof C extends never ? unknown : { [K in keyof C]: StateOf }; export class Updux { #localInitial: any = {}; #subduxes; constructor(config: UpduxConfig) { this.#localInitial = config.initial ?? {}; this.#subduxes = config.subduxes ?? {}; } get initial(): TState & DuxStateSubduxes { if (Object.keys(this.#subduxes).length === 0) return this.#localInitial; return Object.assign( {}, this.#localInitial, R.mapValues(this.#subduxes, ({ initial }) => initial), ); } }