UNPKG

@dhmk/zustand-lens

Version:

Lens support for zustand

45 lines (44 loc) 3.13 kB
import type { StateCreator, StoreMutatorIdentifier, StoreApi, Mutate } from "zustand/vanilla"; import { PropType } from "@dhmk/utils"; export declare const meta: unique symbol; export type SetParameter<T> = Partial<T> | ((state: T) => Partial<T> | void) | ((state: T) => T); export type Setter<T> = (partial: SetParameter<T>, replace?: boolean | undefined, ...args: any[]) => void; export type Getter<T> = () => T; type CreateLensPartialSetter<T> = (partial: T | Partial<T> | ((s: T) => T | Partial<T>), replace?: false, ...args: any[]) => any; type CreateLensStateSetter<T> = (state: T | ((state: T) => T), replace: true, ...args: any[]) => any; type CreateLensSetter<T> = CreateLensPartialSetter<T> | CreateLensStateSetter<T>; export declare function createLens<T, P extends string[]>(set: CreateLensSetter<T>, get: Getter<T>, path: readonly [...P]): [Setter<PropType<T, P>>, Getter<PropType<T, P>>]; export declare function createLens<T, P extends string>(set: CreateLensSetter<T>, get: Getter<T>, path: P): [Setter<PropType<T, [P]>>, Getter<PropType<T, [P]>>]; type IsAny<T> = 0 extends 1 & T ? true : false; export type ResolveStoreApi<X> = IsAny<X> extends true ? StoreApi<any> : X extends StoreApi<any> ? X : X extends unknown ? StoreApi<X> : unknown; declare class LensTypeInfo<T, S> { protected __lensType?: T; protected __lensStoreApi?: (lensStoreApi: S) => void; } export type LensOpaqueType<T, S> = T & LensTypeInfo<T, ResolveStoreApi<S>>; export type LensMetaProps<T, S> = { postprocess?: (state: T, prevState: T, ...args: unknown[]) => Partial<T> | void; setter?: (set: () => void, ctx: LensContext<T, S>) => void; }; export type LensMeta<T, S> = { [p: string | number | symbol]: unknown; [meta]?: LensMetaProps<T, S>; }; export type LensContext<T, S> = { set: Setter<unknown>; get: Getter<T>; api: ResolveStoreApi<S>; rootPath: ReadonlyArray<string>; relativePath: ReadonlyArray<string>; atomic: (fn: () => void) => void; }; export type Lens<T, S = unknown, SetterFn = Setter<T>, Ctx = LensContext<T, S>> = (set: SetterFn, get: Getter<T>, api: ResolveStoreApi<S>, ctx: Ctx) => T & LensMeta<T, S>; export declare function lens<T, S = unknown>(fn: Lens<T, S, Setter<T>>): LensOpaqueType<T, S>; type CheckLenses<T, SA extends StoreApi<unknown>> = { [P in keyof T]: T[P] extends LensTypeInfo<infer L, infer LSA> ? SA extends LSA ? LensOpaqueType<L, LSA> : LensOpaqueType<L, SA> : T[P] extends Function ? T[P] : T[P] extends object ? CheckLenses<T[P], SA> : T[P]; }; type WithLenses = <T, Mps extends [StoreMutatorIdentifier, unknown][] = [], Mcs extends [StoreMutatorIdentifier, unknown][] = []>(f: CheckLenses<T & LensMeta<T, unknown>, Mutate<StoreApi<T>, Mps>> | StateCreator<T, Mps, Mcs, CheckLenses<T & LensMeta<T, unknown>, Mutate<StoreApi<T>, Mps>>>) => StateCreator<T, Mps, Mcs>; export declare const withLenses: WithLenses; type Atomic = <T, Mps extends [StoreMutatorIdentifier, unknown][] = [], Mcs extends [StoreMutatorIdentifier, unknown][] = []>(f: StateCreator<T, Mps, Mcs>) => StateCreator<T, Mps, Mcs>; export declare const atomic: Atomic; export {};