|
1 | 1 | // TypeScript Version: 3.8
|
2 |
| - |
| 2 | +import * as ReactDOMClient from '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 = typeof queries, |
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