1
+ import React from 'react'
2
+ import satisfies from 'semver/functions/satisfies'
3
+
1
4
/* istanbul ignore file */
2
5
// the part of this file that we need tested is definitely being run
3
6
// and the part that is not cannot easily have useful tests written
@@ -15,8 +18,15 @@ function getIsUsingFakeTimers() {
15
18
)
16
19
}
17
20
21
+ const globalObj = typeof window === 'undefined' ? global : window
22
+ let Scheduler = globalObj . Scheduler
23
+ const isModernScheduleCallbackSupported = satisfies ( React . version , '>16.8.6' , {
24
+ includePrerelease : true ,
25
+ } )
26
+
18
27
let didWarnAboutMessageChannel = false
19
28
let enqueueTask
29
+
20
30
try {
21
31
// read require off the module object to get around the bundlers.
22
32
// we don't want them to detect a require and bundle a Node polyfill.
25
35
// assuming we're in node, let's try to get node's
26
36
// version of setImmediate, bypassing fake timers if any.
27
37
enqueueTask = nodeRequire . call ( module , 'timers' ) . setImmediate
38
+ // import React's scheduler so we'll be able to schedule our tasks later on.
39
+ Scheduler = nodeRequire . call ( module , 'scheduler' )
28
40
} catch ( _err ) {
29
41
// we're in a browser
30
42
// we can't use regular timers because they may still be faked
49
61
}
50
62
}
51
63
64
+ function scheduleCallback ( cb ) {
65
+ const NormalPriority = Scheduler
66
+ ? Scheduler . NormalPriority || Scheduler . unstable_NormalPriority
67
+ : null
68
+
69
+ const scheduleFn = Scheduler
70
+ ? Scheduler . scheduleCallback || Scheduler . unstable_scheduleCallback
71
+ : callback => callback ( )
72
+
73
+ return isModernScheduleCallbackSupported
74
+ ? scheduleFn ( NormalPriority , cb )
75
+ : scheduleFn ( cb )
76
+ }
77
+
52
78
export default function flushMicroTasks ( ) {
53
79
return {
54
80
then ( resolve ) {
@@ -59,7 +85,11 @@ export default function flushMicroTasks() {
59
85
jest . advanceTimersByTime ( 0 )
60
86
resolve ( )
61
87
} else {
62
- enqueueTask ( resolve )
88
+ scheduleCallback ( ( ) => {
89
+ enqueueTask ( ( ) => {
90
+ resolve ( )
91
+ } )
92
+ } )
63
93
}
64
94
} ,
65
95
}
0 commit comments