|
1 | 1 | // TypeScript Version: 3.8 |
2 | | - |
| 2 | +import*asReactDOMClientfrom'react-dom/client' |
3 | 3 | import { |
4 | 4 | queries, |
5 | 5 | Queries, |
@@ -43,10 +43,10 @@ export type RenderResult< |
43 | 43 | asFragment: () => DocumentFragment |
44 | 44 | } & {[P in keyof Q]: BoundFunction<Q[P]>} |
45 | 45 |
|
46 | | -export interface RenderOptions< |
47 | | - Q extends Queries=typeofqueries, |
48 | | - Container extends Element | DocumentFragment=HTMLElement, |
49 | | - BaseElement extends Element | DocumentFragment=Container, |
| 46 | +export interface BaseRenderOptions< |
| 47 | + Q extends Queries, |
| 48 | + Container extends RendererableContainer | HydrateableContainer, |
| 49 | + BaseElement extends Element | DocumentFragment, |
50 | 50 | > { |
51 | 51 | /** |
52 | 52 | * By default, React Testing Library will create a div and append that div to the document.body. Your React component will be rendered in the created div. If you provide your own HTMLElement container via this option, |
@@ -93,18 +93,64 @@ export interface RenderOptions< |
93 | 93 | wrapper?: React.JSXElementConstructor<{children: React.ReactNode}> |
94 | 94 | } |
95 | 95 |
|
| 96 | +type RendererableContainer = ReactDOMClient.Container |
| 97 | +type HydrateableContainer = Parameters<typeof ReactDOMClient['hydrateRoot']>[0] |
| 98 | +export interface ClientRenderOptions< |
| 99 | + Q extends Queries, |
| 100 | + Container extends Element | DocumentFragment, |
| 101 | + BaseElement extends Element | DocumentFragment = Container, |
| 102 | +> extends BaseRenderOptions<Q, Container, BaseElement> { |
| 103 | + /** |
| 104 | + * If `hydrate` is set to `true`, then it will render with `ReactDOM.hydrate`. This may be useful if you are using server-side |
| 105 | + * rendering and use ReactDOM.hydrate to mount your components. |
| 106 | + * |
| 107 | + * @see https://testing-library.com/docs/react-testing-library/api/#hydrate) |
| 108 | + */ |
| 109 | + hydrate?: false | undefined |
| 110 | +} |
| 111 | + |
| 112 | +export interface HydrateOptions< |
| 113 | + Q extends Queries, |
| 114 | + Container extends Element | DocumentFragment, |
| 115 | + BaseElement extends Element | DocumentFragment = Container, |
| 116 | +> extends BaseRenderOptions<Q, Container, BaseElement> { |
| 117 | + /** |
| 118 | + * If `hydrate` is set to `true`, then it will render with `ReactDOM.hydrate`. This may be useful if you are using server-side |
| 119 | + * rendering and use ReactDOM.hydrate to mount your components. |
| 120 | + * |
| 121 | + * @see https://testing-library.com/docs/react-testing-library/api/#hydrate) |
| 122 | + */ |
| 123 | + hydrate: true |
| 124 | +} |
| 125 | + |
| 126 | +export type RenderOptions< |
| 127 | + Q extends Queries = typeof queries, |
| 128 | + Container extends RendererableContainer | HydrateableContainer = HTMLElement, |
| 129 | + BaseElement extends Element | DocumentFragment = Container, |
| 130 | +> = |
| 131 | + | ClientRenderOptions<Q, Container, BaseElement> |
| 132 | + | HydrateOptions<Q, Container, BaseElement> |
| 133 | + |
96 | 134 | type Omit<T, K extends keyof T> = Pick<T, Exclude<keyof T, K>> |
97 | 135 |
|
98 | 136 | /** |
99 | 137 | * Render into a container which is appended to document.body. It should be used with cleanup. |
100 | 138 | */ |
101 | 139 | export function render< |
102 | 140 | Q extends Queries = typeof queries, |
103 | | - Container extends Element | DocumentFragment = HTMLElement, |
| 141 | + Container extends RendererableContainer = HTMLElement, |
| 142 | + BaseElement extends Element | DocumentFragment = Container, |
| 143 | +>( |
| 144 | + ui: React.ReactNode, |
| 145 | + options: ClientRenderOptions<Q, Container, BaseElement>, |
| 146 | +): RenderResult<Q, Container, BaseElement> |
| 147 | +export function render< |
| 148 | + Q extends Queries = typeof queries, |
| 149 | + Container extends HydrateableContainer = HTMLElement, |
104 | 150 | BaseElement extends Element | DocumentFragment = Container, |
105 | 151 | >( |
106 | 152 | ui: React.ReactNode, |
107 | | - options: RenderOptions<Q, Container, BaseElement>, |
| 153 | + options: HydrateOptions<Q, Container, BaseElement>, |
108 | 154 | ): RenderResult<Q, Container, BaseElement> |
109 | 155 | export function render( |
110 | 156 | ui: React.ReactNode, |
|
0 commit comments