import { SelectorReturnTypes, Selectors, SelectorsCache, SelectorsWithNewBlock } from '@state-adapt/core'; import { JoinedStore } from './joined-store.interface'; import { WithCoreStoreProps } from './core-store-props.type'; export type StoreEntries = { [index: string]: WithCoreStoreProps; }; type StoreState> = Store extends WithCoreStoreProps ? State : never; export type EntriesState = { [K in string & keyof SE]: StoreState; }; type PrefixedSelectors> = { [K in string & keyof S as K extends 'state' ? never : `${Prefix}${Capitalize}`]: (state: State) => ReturnType; }; type SelectorsOfState = { [K in string & keyof State]: (state: State) => State[K]; }; export type JoinedSelectors = SelectorsOfState> & ({ [K in string & keyof SE]: (x: PrefixedSelectors, K, SE[K]['__']['fullSelectors']>) => void; }[string & keyof SE] extends (x: infer I) => void ? I : never); export type StoreBuilder, SE extends StoreEntries> = { storeEntries: SE; namespaces: (string & keyof SE)[]; selectors: S; fullSelectors: S; initialState: State; getCacheOverride: (c: SelectorsCache) => SelectorsCache; }; type Prev = [never, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]; export type AddNewBlock, SE extends StoreEntries, D extends Prev[number] = 19> = (builder: StoreBuilder) => D extends [never] ? S : NewBlockAdder; export interface NewBlockAdder, SE extends StoreEntries, D extends Prev[number] = 19> { (): JoinedStore; >>(newBlock: NewBlock): {} & ReturnType]: SelectorsWithNewBlock[K]; }, SE, Prev[D]>>; } export {};