import { CB, CacheApi, TinyState, cache, seq, createTinyState, } from 'vest-utils'; import { IReconciler, VestRuntime } from 'vestjs-runtime'; import { SuiteResult, TFieldName, TGroupName, TSchema, } from '../suiteResult/SuiteResultTypes'; import { TIsolateSuite } from './isolate/IsolateSuite/IsolateSuite'; import { useReprocessTree } from './isolate/registerTests'; export type DoneCallback = (res: SuiteResult) => void; type FieldCallbacks = Record; type DoneCallbacks = Array; type StateExtra = { doneCallbacks: TinyState; fieldCallbacks: TinyState; suiteId: string; suiteResultCache: CacheApi>; }; const createSuiteResultCache = () => cache>(); export function useCreateVestState({ VestReconciler, }: { VestReconciler: IReconciler; }) { const stateRef: StateExtra = { doneCallbacks: createTinyState(() => []), fieldCallbacks: createTinyState(() => ({})), suiteId: seq(), suiteResultCache: createSuiteResultCache(), }; return VestRuntime.createRef(VestReconciler, stateRef); } function useVestState() { return VestRuntime.useXAppData(); } export function useDoneCallbacks() { return useVestState().doneCallbacks(); } export function useFieldCallbacks() { return useVestState().fieldCallbacks(); } function useSuiteId() { return useVestState().suiteId; } export function useSuiteResultCache< F extends TFieldName, G extends TGroupName, S extends TSchema = undefined, D = unknown, >(action: CB>): SuiteResult { const suiteResultCache = useVestState().suiteResultCache; return suiteResultCache([useSuiteId()], action) as SuiteResult; } export function usePreviousSuiteResult< F extends TFieldName, G extends TGroupName, S extends TSchema = undefined, D = unknown, >(): SuiteResult | undefined { const suiteResultCache = useVestState().suiteResultCache; return suiteResultCache.get([useSuiteId()])?.[1] as unknown as | SuiteResult | undefined; } export function useExpireSuiteResultCache() { const suiteResultCache = useVestState().suiteResultCache; suiteResultCache.invalidate([useSuiteId()]); } export function useResetCallbacks() { const [, , resetDoneCallbacks] = useDoneCallbacks(); const [, , resetFieldCallbacks] = useFieldCallbacks(); resetDoneCallbacks(); resetFieldCallbacks(); } export function useResetSuite() { useExpireSuiteResultCache(); useResetCallbacks(); VestRuntime.reset(); } export function useLoadSuite(rootNode: TIsolateSuite): void { VestRuntime.useSetHistoryRoot(rootNode); useReprocessTree(rootNode); useExpireSuiteResultCache(); }