1- import { JSXElementConstructor , ReactNode } from " react" ;
2- import type { RootOptions } from " react-dom/client" ;
3- import { cleanupAdd , cleanupRemove } from " ./cleanup.js" ;
1+ import type { JSXElementConstructor , ReactNode } from ' react' ;
2+ import type { RootOptions } from ' react-dom/client' ;
3+ import { cleanupAdd , cleanupRemove } from ' ./cleanup.js' ;
44
55/**
66 * Represents the result of rendering a hook.
77 */
8- export type ResultValue < T > = {
9- readonly value : undefined ;
10- readonly error : Error ;
11- } | {
12- readonly value : T ;
13- readonly error : undefined ;
14- }
8+ export type ResultValue < T > =
9+ | {
10+ readonly value : undefined ;
11+ readonly error : Error ;
12+ }
13+ | {
14+ readonly value : T ;
15+ readonly error : undefined ;
16+ } ;
1517
1618/**
1719 * Represents the last rendered hook result and all previous results.
1820 */
1921export type ResultValues < T > = ResultValue < T > & {
20- readonly all : ResultValue < T > [ ] ;
21- }
22+ readonly all : Array < ResultValue < T > > ;
23+ } ;
2224
2325function newResults < T > ( ) {
24- const results : ResultValue < T > [ ] = [ ]
26+ const results : Array < ResultValue < T > > = [ ] ;
2527
28+ // eslint-disable-next-line @typescript-eslint/consistent-type-assertions
2629 const result = {
2730 get all ( ) {
2831 return [ ...results ] ;
@@ -35,7 +38,7 @@ function newResults<T>() {
3538 return undefined ;
3639 }
3740
38- return results [ results . length - 1 ] . value ;
41+ return results . at ( - 1 ) ! . value ;
3942 } ,
4043 get error ( ) {
4144 // it is impossible to test it in unit-tests - results are populated
@@ -45,9 +48,9 @@ function newResults<T>() {
4548 return undefined ;
4649 }
4750
48- return results [ results . length - 1 ] . error ;
51+ return results . at ( - 1 ) ! . error ;
4952 } ,
50- } as ResultValues < T >
53+ } as ResultValues < T > ;
5154
5255 return {
5356 result,
@@ -56,7 +59,7 @@ function newResults<T>() {
5659 } ,
5760 setError ( error : Error ) {
5861 results . push ( Object . freeze ( { value : undefined , error} ) ) ;
59- }
62+ } ,
6063 } ;
6164}
6265
@@ -65,21 +68,24 @@ export type Renderer<Props> = {
6568 render ( props ?: Props ) : Promise < void > ;
6669 rerender ( props ?: Props ) : Promise < void > ;
6770 unmount ( ) : Promise < void > ;
68- }
71+ } ;
6972
7073// Describes the props that renderer creator receives, which allows it to expose callback invocation results.
7174export type RendererProps < Props , Result > = {
7275 callback ( props : Props ) : Result ;
7376 setValue ( value : Result ) : void ;
7477 setError ( error : Error ) : void ;
75- }
78+ } ;
7679
7780// Describes the renderer creator function that creates a renderer for a specific hook.
78- export type RendererCreator < Props , Result , TRenderer extends Renderer < Props > > = ( props : RendererProps < Props , Result > , options ?: RendererOptions < NoInfer < Props > > ) => TRenderer ;
81+ export type RendererCreator < Props , Result , TRenderer extends Renderer < Props > > = (
82+ props : RendererProps < Props , Result > ,
83+ options ?: RendererOptions < NoInfer < Props > >
84+ ) => TRenderer ;
7985export type RendererOptions < Props > = {
8086 initialProps ?: Props ;
81- wrapper ?: JSXElementConstructor < { children : ReactNode } >
82- } & Pick < RootOptions , 'onCaughtError' | 'onRecoverableError' >
87+ wrapper ?: JSXElementConstructor < { children : ReactNode } > ;
88+ } & Pick < RootOptions , 'onCaughtError' | 'onRecoverableError' > ;
8389
8490export function createHookRenderer < Props , Result , TRenderer extends Renderer < Props > > (
8591 createRenderer : RendererCreator < Props , Result , TRenderer >
@@ -90,24 +96,26 @@ export function createHookRenderer<Props, Result, TRenderer extends Renderer<Pro
9096 // this variable holds previous props, so it is possible to rerender
9197 // with previous props preserved
9298 let hookProps = options ?. initialProps ;
93- const { render, rerender, unmount, ...rest } = createRenderer ( {
94- callback,
95- setValue,
96- setError
97- } , options )
98-
99+ const { render, rerender, unmount, ...rest } = createRenderer (
100+ {
101+ callback,
102+ setValue,
103+ setError,
104+ } ,
105+ options
106+ ) ;
99107
100108 await render ( hookProps ) ;
101109
102110 const rerenderHook = async ( props ?: Props ) => {
103111 hookProps = props ?? hookProps ;
104112 await rerender ( hookProps ) ;
105- }
113+ } ;
106114
107115 const unmountHook = async ( ) => {
108- cleanupRemove ( unmountHook )
116+ cleanupRemove ( unmountHook ) ;
109117 await unmount ( ) ;
110- }
118+ } ;
111119
112120 cleanupAdd ( unmountHook ) ;
113121
@@ -116,6 +124,6 @@ export function createHookRenderer<Props, Result, TRenderer extends Renderer<Pro
116124 rerender : rerenderHook ,
117125 unmount : unmountHook ,
118126 ...rest ,
119- }
120- }
127+ } ;
128+ } ;
121129}
0 commit comments