-
Notifications
You must be signed in to change notification settings - Fork 5
Expand file tree
/
Copy pathrenderToRenderStream.ts
More file actions
98 lines (94 loc) · 2.67 KB
/
renderToRenderStream.ts
File metadata and controls
98 lines (94 loc) · 2.67 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
import {
Queries,
type RenderOptions as BaseOptions,
type RenderResult as BaseResult,
} from '@testing-library/react'
import {
createRenderStream,
type RenderStreamOptions,
type RenderStream,
type ValidSnapshot,
} from './renderStream/createRenderStream.js'
import {SyncQueries} from './renderStream/syncQueries.js'
type RenderOptions<
Snapshot extends ValidSnapshot = void,
Q extends Queries = SyncQueries,
> = BaseOptions<Q> & RenderStreamOptions<Snapshot, Q>
export interface RenderStreamWithRenderResult<
Snapshot extends ValidSnapshot = void,
Q extends Queries = SyncQueries,
> extends RenderStream<Snapshot, Q> {
renderResultPromise: Promise<BaseResult<Q>>
}
/**
* Render into a container which is appended to document.body. It should be used with cleanup.
*/
export function renderToRenderStream<
Snapshot extends ValidSnapshot = void,
Q extends Queries = SyncQueries,
>(
ui: React.ReactNode,
{
onRender,
snapshotDOM,
initialSnapshot,
skipNonTrackingRenders,
queries,
...options
}: RenderOptions<Snapshot, Q> = {},
): RenderStreamWithRenderResult<Snapshot, Q> {
const {
render,
renderAsync: _,
...stream
} = createRenderStream<Snapshot, Q>({
onRender,
snapshotDOM,
initialSnapshot,
skipNonTrackingRenders,
queries,
})
// `render` needs to be called asynchronously here, because the definition of `ui`
// might contain components that reference the return value of `renderToRenderStream`
// itself, e.g. `replaceSnapshot` or `mergeSnapshot`.
const renderResultPromise = Promise.resolve().then(() =>
render<Q>(ui, {...options, queries}),
)
return {...stream, renderResultPromise}
}
/**
* Render into a container which is appended to document.body. It should be used with cleanup.
*/
export function renderToAsyncRenderStream<
Snapshot extends ValidSnapshot = void,
Q extends Queries = SyncQueries,
>(
ui: React.ReactNode,
{
onRender,
snapshotDOM,
initialSnapshot,
skipNonTrackingRenders,
queries,
...options
}: RenderOptions<Snapshot, Q> = {},
): RenderStreamWithRenderResult<Snapshot, Q> {
const {
renderAsync,
render: _,
...stream
} = createRenderStream<Snapshot, Q>({
onRender,
snapshotDOM,
initialSnapshot,
skipNonTrackingRenders,
queries,
})
// `renderAsync` needs to be called asynchronously here, because the definition of `ui`
// might contain components that reference the return value of `renderToRenderStream`
// itself, e.g. `replaceSnapshot` or `mergeSnapshot`.
const renderResultPromise = Promise.resolve().then(() =>
renderAsync<Q>(ui, {...options, queries}),
)
return {...stream, renderResultPromise}
}