import { Store, StoreStateType } from '@zedux/core' import { AtomApi } from '../classes/AtomApi' import { IonTemplate } from '../classes/templates/IonTemplate' import { AtomConfig, AtomGetters, AtomApiPromise, IonStateFactory, PromiseState, } from '../types/index' export const ion: { // Query Atoms < State = any, Params extends any[] = [], Exports extends Record = Record >( key: string, value: ( getters: AtomGetters, ...params: Params ) => AtomApi<{ Exports: Exports Promise: any State: Promise Store: undefined }>, config?: AtomConfig ): IonTemplate<{ State: PromiseState Params: Params Exports: Exports Store: Store> Promise: Promise }> // Custom Stores < StoreType extends Store = Store, Params extends any[] = [], Exports extends Record = Record, PromiseType extends AtomApiPromise = undefined >( key: string, get: ( getters: AtomGetters, ...params: Params ) => | StoreType | AtomApi<{ Exports: Exports Promise: PromiseType State: StoreStateType Store: StoreType }>, config?: AtomConfig> ): IonTemplate<{ State: StoreStateType Params: Params Exports: Exports Store: StoreType Promise: PromiseType }> // No Store < State = any, Params extends any[] = [], Exports extends Record = Record, PromiseType extends AtomApiPromise = undefined >( key: string, get: ( getters: AtomGetters, ...params: Params ) => | AtomApi<{ Exports: Exports Promise: PromiseType State: State Store: undefined }> | State, config?: AtomConfig ): IonTemplate<{ State: State Params: Params Exports: Exports Store: Store Promise: PromiseType }> // Catch-all < State = any, Params extends any[] = [], Exports extends Record = Record, StoreType extends Store = Store, PromiseType extends AtomApiPromise = undefined >( key: string, get: IonStateFactory<{ State: State Params: Params Exports: Exports Store: StoreType Promise: PromiseType }>, config?: AtomConfig ): IonTemplate<{ State: State Params: Params Exports: Exports Store: StoreType Promise: PromiseType }> } = < State = any, Params extends any[] = [], Exports extends Record = Record, StoreType extends Store = Store, PromiseType extends AtomApiPromise = undefined >( key: string, get: IonStateFactory<{ State: State Params: Params Exports: Exports Store: StoreType Promise: PromiseType }>, config?: AtomConfig ) => new IonTemplate(key, get, config)