UNPKG

synapse-storage

Version:

Набор инструментов для управления состоянием и апи-запросами

48 lines (47 loc) 3.69 kB
import type { IStorage, Selectors } from '../../core'; import type { Dispatcher, Effect, Effects } from '../../reactive'; import type { SyncSynapseModule, SyncSynapseOptions } from './synapse.types'; import { type SyncEffectsContext } from './syncModule'; import type { DependencyInput } from './types'; /** Выводит форму состояния из типа хранилища: `IStorage<T>` → `T`. Даёт вывести `TState` из `storage: () => new MemoryStorage<State>()`. */ type StateOf<TStorage> = TStorage extends IStorage<infer TState> ? TState : never; /** Что может вернуть фабрика `effects`: инстанс(ы) `Effects`/функции-эффекты, возможно асинхронно (ленивый резолв endpoints). */ type SyncEffectsResult<TState extends Record<string, any>> = Effects<TState, any, any> | Array<Effects<TState, any, any> | Effect> | undefined | Promise<Effects<TState, any, any> | Array<Effects<TState, any, any> | Effect> | undefined>; /** * Создаёт ленивый class-based synapse (C-форма): синхронная конструкция ядра * (`storage`/`dispatcher`/`selectors`) + `dependencies` (гейт старта эффектов) + фабрика `effects`. * Возвращает {@link SyncSynapseModule} — с синхронным доступом к main-ядру (`.selectors` и т.д.) * для cross-store DI. `TState` выводится из `storage: () => new MemoryStorage<State>()`. * * @example * ```ts * export const postsSynapse = createSynapse({ * storage: () => new MemoryStorage<PostsState>({ name: 'posts', initialState }), * dispatcher: (s) => new PostsDispatcher(s), * selectors: (s) => new PostsSelectors(s, coreSynapse.selectors), // cross-store DI * dependencies: [coreSynapse], * effects: async () => new PostsEffects(await getPostsEndpoints(), coreSynapse.state$), * }) * ``` */ export declare function createSynapse<TStorage extends IStorage<any>, TDispatcher extends Dispatcher<StateOf<TStorage>> | undefined = undefined, TSelectors extends Selectors<StateOf<TStorage>> | undefined = undefined>(config: { storage: () => TStorage; dispatcher?: (storage: TStorage) => TDispatcher; selectors?: (storage: TStorage) => TSelectors; dependencies?: DependencyInput[]; dependencyTimeout?: number; externalDispatchers?: Record<string, Dispatcher<any>> | ((ctx: SyncEffectsContext<StateOf<TStorage>, TDispatcher, TSelectors>) => Record<string, Dispatcher<any>>); effects?: (ctx: SyncEffectsContext<StateOf<TStorage>, TDispatcher, TSelectors>) => SyncEffectsResult<StateOf<TStorage>>; }, options?: SyncSynapseOptions<StateOf<TStorage>, TDispatcher, TSelectors>): SyncSynapseModule<StateOf<TStorage>, TDispatcher, TSelectors>; export declare namespace createSynapse { var of: <TState extends Record<string, any>, TDispatcher extends Dispatcher<TState> | undefined = undefined, TSelectors extends Selectors<TState> | undefined = undefined>(config: { storage: () => IStorage<TState>; dispatcher?: (storage: IStorage<TState>) => TDispatcher; selectors?: (storage: IStorage<TState>) => TSelectors; dependencies?: DependencyInput[]; dependencyTimeout?: number; externalDispatchers?: Record<string, Dispatcher<any>> | ((ctx: SyncEffectsContext<TState, TDispatcher, TSelectors>) => Record<string, Dispatcher<any>>); effects?: (ctx: SyncEffectsContext<TState, TDispatcher, TSelectors>) => SyncEffectsResult<TState>; }, options?: SyncSynapseOptions<TState, TDispatcher, TSelectors>) => SyncSynapseModule<TState, TDispatcher, TSelectors>; } export {};