1
1
import type { ReplResult , ReplStore } from './types' ;
2
2
3
3
// TODO fix useStore to recursively notify subscribers
4
- const deepUpdate = ( prev : any , next : any ) => {
4
+ const deepUpdate = ( prev : any , next : any , matcher ?: ( a : any , b : any ) => boolean ) => {
5
5
for ( const key in next ) {
6
6
if ( prev [ key ] && typeof next [ key ] === 'object' && typeof prev [ key ] === 'object' ) {
7
7
deepUpdate ( prev [ key ] , next [ key ] ) ;
@@ -13,13 +13,7 @@ const deepUpdate = (prev: any, next: any) => {
13
13
}
14
14
if ( Array . isArray ( prev ) ) {
15
15
for ( const item of prev ) {
16
- // can't use Object as a matcher
17
- // because it will be a different object
18
- // so we need to use the path or code
19
-
20
- if (
21
- next . some ( ( nextItem : any ) => ( nextItem . path || nextItem . code ) === ( item . path || item . code ) )
22
- ) {
16
+ if ( ! next . some ( ( nextItem : any ) => ( matcher ? matcher ( nextItem , item ) : nextItem === item ) ) ) {
23
17
prev . splice ( prev . indexOf ( item ) , 1 ) ;
24
18
}
25
19
}
@@ -32,6 +26,8 @@ const deepUpdate = (prev: any, next: any) => {
32
26
}
33
27
} ;
34
28
29
+ const matchByPath = ( a : any , b : any ) => a . path === b . path ;
30
+
35
31
export const updateReplOutput = async ( store : ReplStore , result : ReplResult ) => {
36
32
deepUpdate ( store . diagnostics , result . diagnostics ) ;
37
33
@@ -40,9 +36,9 @@ export const updateReplOutput = async (store: ReplStore, result: ReplResult) =>
40
36
store . html = result . html ;
41
37
}
42
38
43
- deepUpdate ( store . transformedModules , result . transformedModules ) ;
44
- deepUpdate ( store . clientBundles , result . clientBundles ) ;
45
- deepUpdate ( store . ssrModules , result . ssrModules ) ;
39
+ deepUpdate ( store . transformedModules , result . transformedModules , matchByPath ) ;
40
+ deepUpdate ( store . clientBundles , result . clientBundles , matchByPath ) ;
41
+ deepUpdate ( store . ssrModules , result . ssrModules , matchByPath ) ;
46
42
if (
47
43
result . events . length !== store . events . length ||
48
44
result . events . some ( ( ev , i ) => ev ?. start !== store . events [ i ] ?. start )
0 commit comments