import React from 'react'; import { ErrorBoundary } from 'react-error-boundary'; import { act, create, type ReactTestRenderer } from 'react-test-renderer'; type Result = | { __type: 'error'; current: Error; reset: () => void; } | { __type: 'result'; current?: T; }; type TestComponentProps = { executor(): THookReturn; resultRef: Result; }; function TestComponentHookRenderer unknown>({ executor, resultRef, }: TestComponentProps>) { resultRef.current = executor(); return null; } function TestComponent unknown>({ executor, resultRef, }: TestComponentProps>) { return ( { resultRef.__type = 'error'; resultRef.current = error; (resultRef as Extract).reset = resetErrorBoundary; return null; }} onReset={() => { resultRef.__type = 'result'; delete resultRef.current; // eslint-disable-next-line @typescript-eslint/no-explicit-any delete (resultRef as any).reset; }} > ); } export function renderHook(executor: () => THookReturn): { rerenderHook(nextExecutor: () => THookReturn): void; result: Readonly>; } { const result = { __type: 'result' } as Result; let testRenderer: ReactTestRenderer; act(() => { testRenderer = create(); }); return { rerenderHook(nextExecutor) { act(() => { testRenderer.update(); }); }, result, }; }