/** * Adapted from zustand v5.0.3 * * https://github.com/pmndrs/zustand * * Do not modify unless you know what you are doing */ type SetStateInternal = { _( partial: T | Partial | { _(state: T): T | Partial }['_'], replace?: false, ): void; _(state: T | { _(state: T): T }['_'], replace: true): void; }['_']; export interface StoreApi { setState: SetStateInternal; getState: () => T; getInitialState: () => T; subscribe: { (listener: (state: T, prevState: T) => void): () => void; ( selector: (state: T) => U, listener: (selectedState: U, prevSelectedState: U) => void, ): () => void; }; } export type ExtractState = S extends { getState: () => infer T } ? T : never; type Get = K extends keyof T ? T[K] : F; export type Mutate = number extends Ms['length' & keyof Ms] ? S : Ms extends [] ? S : Ms extends [[infer Mi, infer Ma], ...infer Mrs] ? Mutate[Mi & StoreMutatorIdentifier], Mrs> : never; export type StateCreator< T, Mis extends [StoreMutatorIdentifier, unknown][] = [], Mos extends [StoreMutatorIdentifier, unknown][] = [], U = T, > = (( setState: Get, Mis>, 'setState', never>, getState: Get, Mis>, 'getState', never>, store: Mutate, Mis>, ) => U) & { $$storeMutators?: Mos }; // oxlint-disable-next-line no-unused-vars export interface StoreMutators {} export type StoreMutatorIdentifier = keyof StoreMutators; type CreateStore = { ( initializer: StateCreator, ): Mutate, Mos>; (): ( initializer: StateCreator, ) => Mutate, Mos>; }; type CreateStoreImpl = < T, Mos extends [StoreMutatorIdentifier, unknown][] = [], >( initializer: StateCreator, ) => Mutate, Mos>; const createStoreImpl: CreateStoreImpl = (createState) => { type TState = ReturnType; type Listener = (state: TState, prevState: TState) => void; let state: TState; const listeners: Set = new Set(); const setState: StoreApi['setState'] = (partial, replace) => { const nextState = typeof partial === 'function' ? (partial as (state: TState) => TState)(state) : partial; if (!Object.is(nextState, state)) { const previousState = state; state = (replace ?? (typeof nextState !== 'object' || nextState === null)) ? (nextState as TState) : Object.assign({}, state, nextState); listeners.forEach((listener) => listener(state, previousState)); } }; const getState: StoreApi['getState'] = () => state; const getInitialState: StoreApi['getInitialState'] = () => initialState; const subscribe: StoreApi['subscribe'] = ( selectorOrListener: | ((state: TState, prevState: TState) => void) // oxlint-disable-next-line typescript/no-explicit-any | ((state: TState) => any), // oxlint-disable-next-line typescript/no-explicit-any listener?: (selectedState: any, prevSelectedState: any) => void, ) => { // oxlint-disable-next-line typescript/no-explicit-any let selector: ((state: TState) => any) | undefined; // oxlint-disable-next-line typescript/no-explicit-any let actualListener: (state: any, prevState: any) => void; if (listener) { // Selector subscription case // oxlint-disable-next-line typescript/no-explicit-any selector = selectorOrListener as (state: TState) => any; actualListener = listener; } else { // Regular subscription case actualListener = selectorOrListener as ( state: TState, prevState: TState, ) => void; } let currentSlice = selector ? selector(state) : undefined; const wrappedListener = (newState: TState, previousState: TState) => { if (selector) { const nextSlice = selector(newState); const prevSlice = selector(previousState); if (!Object.is(currentSlice, nextSlice)) { currentSlice = nextSlice; actualListener(nextSlice, prevSlice); } } else { actualListener(newState, previousState); } }; listeners.add(wrappedListener); // Unsubscribe return () => listeners.delete(wrappedListener); }; const api = { setState, getState, getInitialState, subscribe }; const initialState = (state = createState(setState, getState, api)); // oxlint-disable-next-line typescript/no-explicit-any return api as any; }; export const createStore = ((createState) => createState ? createStoreImpl(createState) : createStoreImpl) as CreateStore;