@@ -4,6 +4,7 @@ import { actions, dispatch, listen } from 'codesandbox-api';
44import SplitPane from 'react-split-pane' ;
55
66import immer from 'immer' ;
7+ import { debounce } from 'lodash-es' ;
78
89import { Container , TestDetails , TestContainer } from './elements' ;
910
@@ -68,6 +69,7 @@ type State = {
6869
6970type SandboxMessage = { type : 'test' | 'done' } & (
7071 | InitializedTestsMessage
72+ | CompilationDoneMessage
7173 | TestCountMessage
7274 | TotalTestStartMessage
7375 | TotalTestEndMessage
@@ -84,46 +86,50 @@ interface InitializedTestsMessage {
8486 event : messages . INITIALIZE ;
8587}
8688
89+ interface CompilationDoneMessage {
90+ compilatonError : boolean ;
91+ }
92+
8793interface TestCountMessage {
8894 event : 'test_count' ;
8995 count : number ;
9096}
9197
9298interface TotalTestStartMessage {
93- event : 'total_test_start' ;
99+ event : messages . TOTAL_TEST_START ;
94100}
95101
96102interface TotalTestEndMessage {
97- event : 'total_test_end' ;
103+ event : messages . TOTAL_TEST_END ;
98104}
99105
100106interface AddFileMessage {
101- event : 'add_file' ;
107+ event : messages . ADD_FILE ;
102108 path : string ;
103109}
104110
105111interface RemoveFileMessage {
106- event : 'remove_file' ;
112+ event : messages . REMOVE_FILE ;
107113 path : string ;
108114}
109115
110116interface FileErrorMessage {
111- event : 'file_error' ;
117+ event : messages . FILE_ERROR ;
112118 path : string ;
113119 error : TestError ;
114120}
115121
116122interface DescribeStartMessage {
117- event : 'describe_start' ;
123+ event : messages . DESCRIBE_START ;
118124 blockName : string ;
119125}
120126
121127interface DescribeEndMessage {
122- event : 'describe_end' ;
128+ event : messages . DESCRIBE_END ;
123129}
124130
125131interface AddTestMessage {
126- event : 'add_test' ;
132+ event : messages . ADD_TEST ;
127133 testName : string ;
128134 path : string ;
129135}
@@ -135,12 +141,12 @@ type TestMessage = Test & {
135141} ;
136142
137143interface TestStartMessage {
138- event : 'test_start' ;
144+ event : messages . TEST_START ;
139145 test : TestMessage ;
140146}
141147
142148interface TestEndMessage {
143- event : 'test_end' ;
149+ event : messages . TEST_END ;
144150 test : TestMessage ;
145151}
146152
@@ -201,7 +207,21 @@ class Tests extends React.Component<DevToolProps, State> {
201207
202208 handleMessage = ( data : SandboxMessage ) => {
203209 if ( data . type === 'done' && this . state . watching && ! this . props . hidden ) {
204- this . runAllTests ( ) ;
210+ let delay = 1000 ;
211+
212+ if ( data . compilatonError ) {
213+ delay = 2 * delay ;
214+ }
215+
216+ // avoid to often test run in file watching mode,
217+ // very frequent test runs cause screen freezing
218+ debounce (
219+ ( ) => {
220+ this . runAllTests ( ) ;
221+ } ,
222+ delay ,
223+ { maxWait : 4 * delay }
224+ ) ( ) ;
205225 } else if ( data . type === 'test' ) {
206226 switch ( data . event ) {
207227 case messages . INITIALIZE : {
@@ -220,7 +240,7 @@ class Tests extends React.Component<DevToolProps, State> {
220240 }
221241 break ;
222242 }
223- case 'total_test_start' : {
243+ case messages . TOTAL_TEST_START : {
224244 this . currentDescribeBlocks = [ ] ;
225245 if ( this . props . updateStatus ) {
226246 this . props . updateStatus ( 'clear' ) ;
@@ -231,7 +251,7 @@ class Tests extends React.Component<DevToolProps, State> {
231251 } ) ;
232252 break ;
233253 }
234- case 'total_test_end' : {
254+ case messages . TOTAL_TEST_END : {
235255 this . setState ( {
236256 ...this . state ,
237257 running : false ,
@@ -259,7 +279,7 @@ class Tests extends React.Component<DevToolProps, State> {
259279 break ;
260280 }
261281
262- case 'add_file' : {
282+ case messages . ADD_FILE : {
263283 this . setState (
264284 immer ( this . state , state => {
265285 state . files [ data . path ] = {
@@ -272,7 +292,7 @@ class Tests extends React.Component<DevToolProps, State> {
272292 ) ;
273293 break ;
274294 }
275- case 'remove_file' : {
295+ case messages . REMOVE_FILE : {
276296 this . setState (
277297 immer ( this . state , state => {
278298 if ( state . files [ data . path ] ) {
@@ -284,7 +304,7 @@ class Tests extends React.Component<DevToolProps, State> {
284304 ) ;
285305 break ;
286306 }
287- case 'file_error' : {
307+ case messages . FILE_ERROR : {
288308 this . setState (
289309 immer ( this . state , state => {
290310 if ( state . files [ data . path ] ) {
@@ -294,15 +314,15 @@ class Tests extends React.Component<DevToolProps, State> {
294314 ) ;
295315 break ;
296316 }
297- case 'describe_start' : {
317+ case messages . DESCRIBE_START : {
298318 this . currentDescribeBlocks . push ( data . blockName ) ;
299319 break ;
300320 }
301- case 'describe_end' : {
321+ case messages . DESCRIBE_END : {
302322 this . currentDescribeBlocks . pop ( ) ;
303323 break ;
304324 }
305- case 'add_test' : {
325+ case messages . ADD_TEST : {
306326 const testName = [ ...this . currentDescribeBlocks , data . testName ] ;
307327
308328 this . setState (
@@ -326,7 +346,7 @@ class Tests extends React.Component<DevToolProps, State> {
326346 ) ;
327347 break ;
328348 }
329- case 'test_start' : {
349+ case messages . TEST_START : {
330350 const test = data . test ;
331351 const testName = [ ...test . blocks , test . name ] ;
332352
@@ -356,7 +376,7 @@ class Tests extends React.Component<DevToolProps, State> {
356376 ) ;
357377 break ;
358378 }
359- case 'test_end' : {
379+ case messages . TEST_END : {
360380 const test = data . test ;
361381 const testName = [ ...test . blocks , test . name ] ;
362382
0 commit comments