@@ -6,6 +6,7 @@ import {RenderInstance, type Render, type BaseRender} from './Render.js'
6
6
import { type RenderStreamContextValue } from './context.js'
7
7
import { RenderStreamContextProvider } from './context.js'
8
8
import { disableActWarnings } from './disableActWarnings.js'
9
+ import { syncQueries , type Queries , type SyncQueries } from './syncQueries.js'
9
10
10
11
export type ValidSnapshot =
11
12
// eslint-disable-next-line @typescript-eslint/no-invalid-void-type
@@ -29,7 +30,10 @@ interface MergeSnapshot<Snapshot> {
29
30
) : void
30
31
}
31
32
32
- export interface RenderStream < Snapshot extends ValidSnapshot > {
33
+ export interface RenderStream <
34
+ Snapshot extends ValidSnapshot ,
35
+ Q extends Queries = SyncQueries ,
36
+ > {
33
37
// Allows for partial updating of the snapshot by shallow merging the results
34
38
mergeSnapshot : MergeSnapshot < Snapshot >
35
39
// Performs a full replacement of the snapshot
@@ -39,21 +43,22 @@ export interface RenderStream<Snapshot extends ValidSnapshot> {
39
43
* Errors thrown during component render will be captured here, too.
40
44
*/
41
45
renders : Array <
42
- Render < Snapshot > | { phase : 'snapshotError' ; count : number ; error : unknown }
46
+ | Render < Snapshot , Q >
47
+ | { phase : 'snapshotError' ; count : number ; error : unknown }
43
48
>
44
49
/**
45
50
* Peeks the next render from the current iterator position, without advancing the iterator.
46
51
* If no render has happened yet, it will wait for the next render to happen.
47
52
* @throws {WaitForRenderTimeoutError } if no render happens within the timeout
48
53
*/
49
- peekRender : ( options ?: NextRenderOptions ) => Promise < Render < Snapshot > >
54
+ peekRender : ( options ?: NextRenderOptions ) => Promise < Render < Snapshot , Q > >
50
55
/**
51
56
* Iterates to the next render and returns it.
52
57
* If no render has happened yet, it will wait for the next render to happen.
53
58
* @throws {WaitForRenderTimeoutError } if no render happens within the timeout
54
59
*/
55
60
takeRender : Assertable &
56
- ( ( options ?: NextRenderOptions ) => Promise < Render < Snapshot > > )
61
+ ( ( options ?: NextRenderOptions ) => Promise < Render < Snapshot , Q > > )
57
62
/**
58
63
* Returns the total number of renders.
59
64
*/
@@ -62,20 +67,27 @@ export interface RenderStream<Snapshot extends ValidSnapshot> {
62
67
* Returns the current render.
63
68
* @throws {Error } if no render has happened yet
64
69
*/
65
- getCurrentRender : ( ) => Render < Snapshot >
70
+ getCurrentRender : ( ) => Render < Snapshot , Q >
66
71
/**
67
72
* Waits for the next render to happen.
68
73
* Does not advance the render iterator.
69
74
*/
70
- waitForNextRender : ( options ?: NextRenderOptions ) => Promise < Render < Snapshot > >
75
+ waitForNextRender : (
76
+ options ?: NextRenderOptions ,
77
+ ) => Promise < Render < Snapshot , Q > >
71
78
}
72
79
73
- export interface RenderStreamWithRenderFn < Snapshot extends ValidSnapshot >
74
- extends RenderStream < Snapshot > {
80
+ export interface RenderStreamWithRenderFn <
81
+ Snapshot extends ValidSnapshot ,
82
+ Q extends Queries = SyncQueries ,
83
+ > extends RenderStream < Snapshot , Q > {
75
84
render : typeof baseRender
76
85
}
77
86
78
- export type RenderStreamOptions < Snapshot extends ValidSnapshot > = {
87
+ export type RenderStreamOptions <
88
+ Snapshot extends ValidSnapshot ,
89
+ Q extends Queries = SyncQueries ,
90
+ > = {
79
91
onRender ?: (
80
92
info : BaseRender & {
81
93
snapshot : Snapshot
@@ -90,6 +102,7 @@ export type RenderStreamOptions<Snapshot extends ValidSnapshot> = {
90
102
* `useTrackRenders` occured.
91
103
*/
92
104
skipNonTrackingRenders ?: boolean
105
+ queries ?: Q
93
106
}
94
107
95
108
export class WaitForRenderTimeoutError extends Error {
@@ -100,19 +113,26 @@ export class WaitForRenderTimeoutError extends Error {
100
113
}
101
114
}
102
115
103
- export function createRenderStream < Snapshot extends ValidSnapshot = void > ( {
116
+ export function createRenderStream <
117
+ Snapshot extends ValidSnapshot = void ,
118
+ Q extends Queries = SyncQueries ,
119
+ > ( {
104
120
onRender,
105
121
snapshotDOM = false ,
106
122
initialSnapshot,
107
123
skipNonTrackingRenders,
108
- } : RenderStreamOptions < Snapshot > = { } ) : RenderStreamWithRenderFn < Snapshot > {
124
+ queries = syncQueries as any as Q ,
125
+ } : RenderStreamOptions < Snapshot , Q > = { } ) : RenderStreamWithRenderFn <
126
+ Snapshot ,
127
+ Q
128
+ > {
109
129
// creating the object first and then assigning in all the properties
110
130
// allows keeping the object instance for reference while the members are
111
131
// created, which is important for the `markAssertable` function
112
- const stream = { } as any as RenderStreamWithRenderFn < Snapshot >
132
+ const stream = { } as any as RenderStreamWithRenderFn < Snapshot , Q >
113
133
114
- let nextRender : Promise < Render < Snapshot > > | undefined ,
115
- resolveNextRender : ( ( render : Render < Snapshot > ) => void ) | undefined ,
134
+ let nextRender : Promise < Render < Snapshot , Q > > | undefined ,
135
+ resolveNextRender : ( ( render : Render < Snapshot , Q > ) => void ) | undefined ,
116
136
rejectNextRender : ( ( error : unknown ) => void ) | undefined
117
137
function resetNextRender ( ) {
118
138
nextRender = undefined
@@ -199,6 +219,7 @@ export function createRenderStream<Snapshot extends ValidSnapshot = void>({
199
219
snapshot ,
200
220
domSnapshot ,
201
221
renderStreamContext . renderedComponents ,
222
+ queries ,
202
223
)
203
224
renderStreamContext . renderedComponents = [ ]
204
225
stream . renders . push ( render )
@@ -247,7 +268,8 @@ export function createRenderStream<Snapshot extends ValidSnapshot = void>({
247
268
replaceSnapshot,
248
269
mergeSnapshot,
249
270
renders : new Array <
250
- Render < Snapshot > | { phase : 'snapshotError' ; count : number ; error : unknown }
271
+ | Render < Snapshot , Q >
272
+ | { phase : 'snapshotError' ; count : number ; error : unknown }
251
273
> ( ) ,
252
274
totalRenderCount ( ) {
253
275
return stream . renders . length
@@ -316,12 +338,12 @@ export function createRenderStream<Snapshot extends ValidSnapshot = void>({
316
338
} ,
317
339
waitForNextRender ( { timeout = 1000 } : NextRenderOptions = { } ) {
318
340
if ( ! nextRender ) {
319
- nextRender = Promise . race < Render < Snapshot > > ( [
320
- new Promise < Render < Snapshot > > ( ( resolve , reject ) => {
341
+ nextRender = Promise . race < Render < Snapshot , Q > > ( [
342
+ new Promise < Render < Snapshot , Q > > ( ( resolve , reject ) => {
321
343
resolveNextRender = resolve
322
344
rejectNextRender = reject
323
345
} ) ,
324
- new Promise < Render < Snapshot > > ( ( _ , reject ) =>
346
+ new Promise < Render < Snapshot , Q > > ( ( _ , reject ) =>
325
347
setTimeout ( ( ) => {
326
348
const error = new WaitForRenderTimeoutError ( )
327
349
Error . captureStackTrace ( error , stream . waitForNextRender )
0 commit comments