import { act } from "@testing-library/react"; import { vi, afterEach } from "vitest"; import type * as ZustandExportedTypes from "zustand"; export * from "zustand"; const { create: actualCreate, createStore: actualCreateStore } = await vi.importActual("zustand"); // a variable to hold reset functions for all stores declared in the app export const storeResetFns = new Set<() => void>(); const createUncurried = ( stateCreator: ZustandExportedTypes.StateCreator, ) => { const store = actualCreate(stateCreator); const initialState = store.getInitialState(); storeResetFns.add(() => { store.setState(initialState, true); }); return store; }; // when creating a store, we get its initial state, create a reset function and add it in the set export const create = (( stateCreator: ZustandExportedTypes.StateCreator, ) => // to support curried version of create typeof stateCreator === "function" ? createUncurried(stateCreator) : createUncurried) as typeof ZustandExportedTypes.create; const createStoreUncurried = ( stateCreator: ZustandExportedTypes.StateCreator, ) => { const store = actualCreateStore(stateCreator); const initialState = store.getInitialState(); storeResetFns.add(() => { store.setState(initialState, true); }); return store; }; // when creating a store, we get its initial state, create a reset function and add it in the set export const createStore = (( stateCreator: ZustandExportedTypes.StateCreator, ) => // to support curried version of createStore typeof stateCreator === "function" ? createStoreUncurried(stateCreator) : createStoreUncurried) as typeof ZustandExportedTypes.createStore; // reset all stores after each test run afterEach(() => { act(() => { storeResetFns.forEach((resetFn) => { resetFn(); }); }); });